home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / SourceCode / Random2.0 / Source / Gaussian.m < prev    next >
Text File  |  1995-06-12  |  2KB  |  144 lines

  1. //
  2. // Gaussian
  3. //
  4. // Copyright (C) 1992 Contemporary Design Studios. All rights reserved.
  5. //
  6.  
  7.  
  8. #import "Gaussian.h"
  9. #import <math.h>
  10. #import <stdio.h>
  11.  
  12.  
  13. @implementation Gaussian
  14.  
  15.  
  16. //
  17. // init
  18. //
  19.  
  20. - initEngineInstance:anObject
  21. {
  22.     [super initEngineInstance:anObject];        
  23.     
  24.     iset = 0;                // No saved gaussian yet.
  25.     gset = 0.0;
  26.     
  27.     gscale = 1.0;
  28.     gorigin = 0.0;
  29.  
  30.     return self;
  31. }
  32.  
  33.  
  34. //
  35. // gScale
  36. //
  37.  
  38. - (double)gScale
  39. {
  40.     return gscale;
  41. }
  42.  
  43.  
  44. //
  45. // setGScale:
  46. //
  47.  
  48. - setGScale:(double)aScale
  49. {
  50.     gscale = aScale;
  51.     
  52.     return self;
  53. }
  54.  
  55.  
  56. //
  57. // gOrigin
  58. //
  59.  
  60. - (double)gOrigin
  61. {
  62.     return gorigin;
  63. }
  64.  
  65.  
  66. //
  67. // setGOrigin:
  68. //
  69.  
  70. - setGOrigin:(double)anOrigin
  71. {
  72.     gorigin = anOrigin;
  73.     
  74.     return self;
  75. }
  76.  
  77.  
  78. //
  79. // gaussian
  80. //
  81.  
  82. - (double)gaussian
  83. {
  84.     double        fac, r, temp;
  85.     volatile double    v1, v2;            // Prevent compiler warning about un-init.
  86.     
  87.     if(iset == 0) {                // If none stored, calculate a pair.
  88.         do {                    // Find a pair which are inside unit circle.
  89.         v1 = 2.0 * [self percent] - 1.0;
  90.         v2 = 2.0 * [self percent] - 1.0;
  91.         r = (v1 * v1) + (v2 * v2);
  92.     } while((r >= 1.0) || (r == 0.0));
  93.     
  94.     fac = sqrt(-2.0 * log(r) / r);        // Do Box-Muller transformation.
  95.     gset = v1 * fac;
  96.     iset = 1;
  97.     
  98.     temp = v2 * fac;            // Return one of the pair.
  99.     
  100. //    printf("Gaussian: New value = %f, new stored value = %f\n", temp, gset);
  101.     }
  102.     else {                    // Otherwise return stored one.
  103.         iset = 0;
  104.     temp = gset;
  105.     }
  106.     
  107.     return ((temp * gscale) + gorigin);        // Modify the variable.
  108. }
  109.  
  110.  
  111. //
  112. // read:
  113. //
  114.  
  115. - read:(NXTypedStream *)stream
  116. {
  117.     [super read:stream];
  118.     
  119.     NXReadTypes(stream, "iddd", &iset, &gset, &gscale, &gorigin);
  120.     
  121.     return self;
  122. }
  123.  
  124.  
  125. //
  126. // write:
  127. //
  128.  
  129. - write:(NXTypedStream *)stream
  130. {
  131.     [super write:stream];
  132.     
  133.     NXWriteTypes(stream, "iddd", &iset, &gset, &gscale, &gorigin);
  134.  
  135.     return self;
  136. }
  137.  
  138.  
  139. @end
  140.  
  141.  
  142. //
  143. // End of file.
  144. //